StringGrid - text sirsi nez sirka bunky

Otázka od: Jiri Novotny

16. 10. 2002 10:46

Ahoj!

Mam na formulari StringGrid se 3 sloupci, ktery vypada priblizne
takto:

Souradnice bodu
  2 5 7
  3 1 4
  5 1 1
Souradnice bodu
  1 1 2
  2 3 3
....

Vykresluji si to pomoci udalosti OnDrawCell, ale nemohu prijit na to,
jak spravne vypsat ty radky s textem "souradnice bodu". Delam to
(napr. pro 1. radek) tak, ze
  StringGrid.Cells[0,0] := 'Souradnice bodu';

a dale mam (zjednodusene)

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with StringGrid1.Canvas do begin
    case ARow of
      0, 4 : begin
            Font.Name := 'Arial';
            Font.Color := clLime;
            Brush.Color := clNavy;
          end;
      else begin
            Font.Name := 'Courier New';
            Font.Color := clBlack;
            Brush.Color := clWhite;
      end;
    end;
    FillRect(Rect);
    TextOut(Rect.Left+2,Rect.Top,StringGrid1.Cells[ACol,ARow]);
  end;
end;

Toto mi funguje bez problemu pro ty cisla, ale napis "souradnice
bodu" se mi
oreze jen na sirku bunky v prvnim sloupecku.
Predpokladam, ze je to tim, ze udalost OnDrawCell mi vykresli v
kazdem radku napred 1. sloupecek (to se text vypise OK), jenze pak
se vykresli 2. sloupec a dojde k premazani presahujiciho textu.

Nevite jak to obejit, aby se ten text nemazal?

Jirka.

Odpovedá: Peter Surovy

16. 10. 2002 11:47

Ahoj
----- Original Message -----
From: "Jiri Novotny" <novotny@ftknw.upol.cz>
Sent: Wednesday, October 16, 2002 10:25 AM

-- pokial moje skromne vedomosti siahaju - tak sa to neda
to by musela byt nejaka nowrap moznost a to nie je  

-- myslim ze to robis dost od veci
stringgrid je od slovicka grid t.j. mriezka
a Ty tam mriezku nedodrzujes lebo do nej vkladas cele riadky ;
mozno by si mal namiesto tych
"Suradnice bodu " dat len nejaky Edit a potom vlozit maly grid
s hodnotami pocas runtime.
a tak... ved nemusis vsetko davat do jedneho StringGridu ako by to
bol Excel-ovsky zosit. Teda aspon ja by som to takto robil..
Peter Surovy



> Mam na formulari StringGrid se 3 sloupci, ktery vypada priblizne
> takto:
>
> Souradnice bodu
> 2 5 7
> 3 1 4
> 5 1 1
> Souradnice bodu
> 1 1 2
> 2 3 3
> ....
>
> Vykresluji si to pomoci udalosti OnDrawCell, ale nemohu prijit na to,
> jak spravne vypsat ty radky s textem "souradnice bodu". Delam to
> (napr. pro 1. radek) tak, ze
> StringGrid.Cells[0,0] := 'Souradnice bodu';
>
> a dale mam (zjednodusene)
>

Odpovedá: Petr Fejfar

16. 10. 2002 12:43

From: "Jiri Novotny" <novotny@ftknw.upol.cz>

> Toto mi funguje bez problemu pro ty cisla, ale napis "souradnice
> bodu" se
mi oreze jen na sirku bunky v prvnim sloupecku.
> Predpokladam, ze je to tim, ze udalost OnDrawCell mi vykresli v
> kazdem radku napred 1. sloupecek (to se text vypise OK), jenze pak
> se vykresli 2. sloupec a dojde k premazani presahujiciho textu.

Musis potlacit kresleni tech bunek prepsanych tim textem:

1. Musis vypnout DefaultDrawing, aby ti to nemazalo pozadi
2. Musis zvetsit sirku policka, do ktereho pises text
3. Musis preskakat zakryta policka


V Tvem prikladu principielne takto:


    case ARow of
      0, 4: if aCol=0 then
              begin
                Font.Name := 'Arial';
                Font.Color := clLime;
                Brush.Color := clNavy;
                WideRect := classes.Rect(Rect.Left,Rect.Top,(Sender as
tControl).Width,Rect.Bottom);
                FillRect(WideRect);
                TextOut
(WideRect.Left+2,WideRect.Top,StringGrid1.Cells[ACol,ARow]);
              end
            else
              ;
      else begin
            Font.Name := 'Courier New';
            Font.Color := clBlack;
            Brush.Color := clWhite;
            FillRect(Rect);
            TextOut(Rect.Left+2,Rect.Top,StringGrid1.Cells[ACol,ARow]);
      end;
    end;


HTH, pf

Odpovedá: Peter Vlkovic

16. 10. 2002 14:07

Ahoj,

Nizsie ti posielam ukazku, ako mozno riesit prekreslovanie
v StringGride s niektorymi bunkami presahujucimi viacere stlpce
(pozor nesmies zabudnut nastavit DefaultDrawing na False).
Ak chces, mozem ti pripadne poslat zlozitejsiu verziu ukazky.

Vlkovic


// inicializacia
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  StringGrid1.RowCount := 10;
  for i := 0 to StringGrid1.RowCount - 1 do
      begin
      StringGrid1.Cells[0,i] := IntToStr ( 100 + i );
      StringGrid1.Cells[1,i] := IntToStr ( 200 + i );
      StringGrid1.Cells[2,i] := IntToStr ( 300 + i );
      end;
end;

// obsluha prekreslovania
procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
var
  SG: TStringGrid;
  ACell: string;
  AddWidth: integer;
begin
  SG := Sender as TStringGrid;
  if ( Row = 0 ) or ( Row = 5 ) then // na tychto riadkoch bude nadpis
     begin
     if Col = 0 then // obsluhuje sa prekreslovanie len prveho stlpca
        begin
        AddWidth := SG.ColWidths[1] + SG.ColWidths[2]; // sirka 2. a 3.
stlpca
        Rect.Right := Rect.Right + AddWidth;
        SG.Canvas.FillRect ( Rect );
        SG.Canvas.TextRect ( Rect, Rect.Left, Rect.Top, 'Text cez tri
bunky'
);
        end;
     end
  else
    begin // obsluha prekreslovania ostatnych buniek
    ACell := SG.Cells[Col,Row]; // obsah bunky
    SG.Canvas.TextOut ( Rect.Left, Rect.Top, ACell );
    end;
end;



> Mam na formulari StringGrid se 3 sloupci, ktery vypada priblizne
> takto:
>
> Souradnice bodu
> 2 5 7
> 3 1 4
> 5 1 1
> Souradnice bodu
> 1 1 2
> 2 3 3
> ....
>
> nemohu prijit na to, jak spravne vypsat ty radky s textem
> "souradnice bodu".
>
> Jirka.